/*
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.security;

/**
 * A GuardedObject is an object that is used to protect access to
 * another object.
 *
 * <p>A GuardedObject encapsulates a target object and a Guard object,
 * such that access to the target object is possible
 * only if the Guard object allows it.
 * Once an object is encapsulated by a GuardedObject,
 * access to that object is controlled by the {@code getObject}
 * method, which invokes the
 * {@code checkGuard} method on the Guard object that is
 * guarding access. If access is not allowed,
 * an exception is thrown.
 *
 * @author Roland Schemers
 * @author Li Gong
 * @see Guard
 * @see Permission
 */

public class GuardedObject implements java.io.Serializable {

  private static final long serialVersionUID = -5240450096227834308L;

  private Object object; // the object we are guarding
  private Guard guard;   // the guard

  /**
   * Constructs a GuardedObject using the specified object and guard.
   * If the Guard object is null, then no restrictions will
   * be placed on who can access the object.
   *
   * @param object the object to be guarded.
   * @param guard the Guard object that guards access to the object.
   */

  public GuardedObject(Object object, Guard guard) {
    this.guard = guard;
    this.object = object;
  }

  /**
   * Retrieves the guarded object, or throws an exception if access
   * to the guarded object is denied by the guard.
   *
   * @return the guarded object.
   * @throws SecurityException if access to the guarded object is denied.
   */
  public Object getObject()
      throws SecurityException {
    if (guard != null) {
      guard.checkGuard(object);
    }

    return object;
  }

  /**
   * Writes this object out to a stream (i.e., serializes it).
   * We check the guard if there is one.
   */
  private void writeObject(java.io.ObjectOutputStream oos)
      throws java.io.IOException {
    if (guard != null) {
      guard.checkGuard(object);
    }

    oos.defaultWriteObject();
  }
}
